package service

import (
	"context"
	"manage/api/class"
	"manage/api/course"
	"manage/api/exam"
	"manage/api/user"
	"strings"

	"github.com/Fromsko/gouitls/logs"
	Kgrpc "github.com/go-kratos/kratos/v2/transport/grpc"
	"github.com/sirupsen/logrus"
	"google.golang.org/grpc"
)

var echo *logrus.Logger

func init() {
	echo = logs.InitLogger()
}

// Remote Grpc 服务器
type Remote struct {
	User   call // 用户
	Exam   call // 考试
	Class  call // 班级
	Course call // 课程
}

type call struct {
	Fun any
	Ctx context.Context
}

// NewRemoteClient 连接
func NewRemoteClient(config map[string]string) *Remote {
	r := &Remote{}

	for service, endpoint := range config {
		if conn, ctx, err := client(endpoint); err == nil {
			switch strings.ToLower(service) {
			case "user":
				r.User.Fun = user.NewUserServiceClient(conn)
				r.User.Ctx = ctx
			case "exam":
				r.Exam.Fun = exam.NewExamServiceClient(conn)
				r.Exam.Ctx = ctx
			case "class":
				r.Class.Fun = class.NewClassServiceClient(conn)
				r.Class.Ctx = ctx
			case "course":
				r.Course.Fun = course.NewCourseServiceClient(conn)
				r.Course.Ctx = ctx
			}
		}
	}

	echo.Info("Successfully connected to another service")
	return r
}

// client 创建 grpc 远程连接
func client(endpoint string) (*grpc.ClientConn, context.Context, error) {
	ctx := context.Background()
	conn, err := Kgrpc.DialInsecure(
		ctx, Kgrpc.WithEndpoint(endpoint),
	)
	if err != nil {
		echo.Errorf("[%s] 创建 Grpc 连接失败: %s", endpoint, err)
		return nil, ctx, err
	}
	return conn, ctx, err
}

/*
	服务列表

		用户：
			- 管理员
				- 管理教师
				- 管理课程
			- 教师
				- 考试
				- 学生
			- 学生
				- 考试
				- 成绩
		考试：
			- Redis 发布考试
			- 自动组卷
		课程：
			- 老师
			- 学生
*/
